/**
 * 网页进入休眠时，收不到 MQTT 推送，也没法维护联系人列表
 * 从休眠中恢复时，休眠期间聊过天的联系人就不会出现在列表里，而往下拉列表，也不会拉到他们（因为他们应该排在前面）
 * 为应对此情况，从休眠中恢复时，固定刷新网页。
 *
 * 刷新策略：
 * 1. 页面后台运行时，定时刷新（而不是固定在页面回到前台运行时触发刷新，这样用户体验好点，能减少用户回到页面时看到在刷新而等待的概率）
 * 2. 有可能因网页休眠等原因，并没有按时执行定时刷新，如果发现进入前台时持续时间已达到限额，也触发一次刷新
 */
import { getLogger } from '@gnlab/utils'
import { App } from 'antd'
import { disableLeaveConfirm } from './leave-confirm'

const logger = getLogger('ui/handle-weak-on')

const REFRESH_INTERVAL = 15 * 60 * 1000 // 每隔一段时间刷新一次（单位：毫秒）

export function useHandleWeakOn() {
  const { modal } = App.useApp()

  useEffect(() => {
    let latestRefresh = Date.now()
    function refresh() {
      latestRefresh = Date.now()
      disableLeaveConfirm() // 先禁用离开页面的提示，不然无法刷新
      location.reload()
    }

    let intervalId: NodeJS.Timeout | null = null
    const handler = () => {
      logger.debug(document.hidden ? '页面进入后台' : '页面回到前台')

      const now = Date.now()
      if (document.hidden) {
        latestRefresh = now
        intervalId = setInterval(refresh, REFRESH_INTERVAL)
      } else {
        if (intervalId !== null) clearInterval(intervalId)
        const diff = now - latestRefresh
        logger.debug('后台持续时间', diff)
        if (diff > REFRESH_INTERVAL) refresh()
      }
    }
    document.addEventListener('visibilitychange', handler, false)

    return () => {
      if (intervalId !== null) clearInterval(intervalId)
      document.removeEventListener('visibilitychange', handler, false)
    }
  }, [modal])
}
